package main

import (
	"errors"
	"fmt"
	"log"
	"my-go-chat/message"
	"my-go-chat/process"
	"my-go-chat/utils"
	"net"
)

//依然创建Processor 的结构体  直接将conn封装为结构体进行传递
type Processor struct {
	Conn net.Conn
}

//主控代码 负责处理与每个客户端的连接的主要业务
func (mp *Processor) MainProcess() (err error) {
	//创建操作客户端的连接对象  读取客户端发送的消息
	tf := &utils.Transfer{
		Conn: mp.Conn,
	}
	for {
		//这里将读取数据包的工作封装为一个函数readpkg 返回message err
		mes, err := tf.ReadPkg()
		if err != nil { //!!!! 这里的 err 跟 返回值err的作用域不同 直接return err 否则丢失
			return err
		}
		log.Println(mes)
		err = mp.ServerProcessMes(&mes)
		if err != nil {
			//如果不是eof 错误  继续保持连接 仅打印错误
			fmt.Println(err)
		}
	}
}

//编写ServerProcessMes 函数
// 功能：根据客户端发送消息种类的不同，决定调用哪个函数来处理
func (p *Processor) ServerProcessMes(mes *message.Message) (err error) {
	fmt.Println("mes=", mes)
	switch mes.Type {
	case message.LoginMesType:
		//处理登录逻辑
		up := &process.UserProcess{ //这里在每个case下创建up实例 是因为有的逻辑可能不需要up所以单独创建
			Conn: p.Conn,
		}
		err = up.ServerProcessLogin(mes)
	case message.RegisterMesType:
		//处理登录逻辑
		up := &process.UserProcess{
			Conn: p.Conn,
		}
		err = up.ServerProcessRegister(mes)
	case message.SmsMesType:
		//这里转发群发消息时 返回的消息类型是不一定的 如 smsResMes
		smsProcess := &process.SmsProcess{}
		smsProcess.SendGroupMes(mes)
	default:
		err = errors.New("消息类型未知！")
	}
	return
}
